// 有一种技巧可以对数据进行加密，它使用一个单词作为它的密匙。下面是它的工作原理：首先，
// 选择一个单词作为密匙，如TRAILBLAZERS。如果单词中包含有重复的字母，只保留第1个，其余几个丢弃
// 。现在，修改过的那个单词属于字母表的下面，如下所示：
// A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
// T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
// 上面其他用字母表中剩余的字母填充完整。在对信息进行加密时，信息中的每个字母被固定于顶上那行，
// 并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此，使用这个密匙，
// Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。
// 请实现下述接口，通过指定的密匙和明文得到密文。
// 本题有多组输入数据。
// 输入描述:
// 先输入key和要加密的字符串
// 输出描述:
// 返回加密后的字符串
// 示例1
// 输入
// nihao
// ni
// 输出
// le

#include <iostream>
#include <string>
#include <vector>
#include <cassert>

using std::cout;
using std::endl;

vector<char>table;

bool Isinstr(string ss,char c){
    for(int i=0;i<ss.length();i++){
        if(c == ss[i])return true;
    }

    return false;
}
bool Isinstr(vector<char>v,char c){
    for(int i=0;i<v.length();i++){
        if(c == v[i])return true;
    }

    return false;
}

string remove(string key){
    string result;
    result += key[0];

    for(int i=0;i <key.length();i++){
        if(! Isinstr)
            result +=key[i];
    }

    return result;
}

bool reserve(char &c){
    if(c >='a'&& c<='z')
        c = c -'a'+'A';

    if(c>='A' && c<='Z')
        c=c+'a'-'A';
    
    return true;
}

bool Islow(char c){
    if(c>='a'&&c<='z')
        return true;
    else 
        return false;
}

bool parse(string key,string to_code){
    string removed_key = remove(key);

    if(removed_key.length() <0 || removed_key.length() > 26)
        return false;
    
    int len_of_rdkey = removed_key.length();

    vector<char>v;
    for(int = 0;i< len_of_rdkey;i++){
        if(Islow(removed_key[i])){
            reserve(removed_key[i]);
            v.push_back(removed_key[i]);
        }else 
            v.push_back(removed_key[i]);
    }
    for(int i = 0; i < 26; i++){
        if(!Isinstr(v,table[i]))
            v.push_back(table[i]);
    }
    assert(v.length() == 26);

    
    string result;
    for(int i=0;i<to_code.length();i++){
        for(int j=0;j<table.length();j++){
            if(to_code[i]== table[j]){
                if(Islow(to_code[i])){
                    result += reserve(v[j]);
                }else
                    result += v[j];
            }
        }
    }
    assert(result.length() == to_code.length());

    cout<<result<<endl;

    return true;
}

int main(int agrc, char ** agrv){
    string key;
    string to_code;
    int k;

    k = scanf("%s%s",&key,&to_code);

    for(int i = 0;i<26;i++){
        table.push_back('A'+i);
    }

    while(k == 2){

        parse(key,to_code);

        k = scanf("%s%s",&key,&to_code);
    }

    return 0;
}